package com.developer.logic.modulo.partidos;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.developer.core.utils.SimpleLogger;
import com.developer.logic.modulo.equipos.EquipoServicio;
import com.developer.logic.modulo.equipos.dto.Equipo;
import com.developer.logic.modulo.grupos.GrupoServicio;
import com.developer.logic.modulo.grupos.dto.Grupo;
import com.developer.logic.modulo.partidos.dto.Partido;
import com.developer.mybatis.DBManager;
import com.developer.persistence.modulo.grupos.GrupoControllerDB;
import com.developer.persistence.modulo.partidos.PartidoControllerDB;

public class PartidoServicio {
	
	private static PartidoServicio instance;
	
	public static PartidoServicio getInstance() {
		if (instance == null) {
			instance = new PartidoServicio();
		}
		
		return instance;
	}
			
	public List<Partido> getPartidosPorGrupo(Grupo grupo){
		
		PartidoControllerDB controllerDB = PartidoControllerDB.getInstance();
		List<Partido> listaPartidos= controllerDB.getPartidosPorGrupo(grupo);
		
		if(listaPartidos!= null && listaPartidos.size()>0){
			
			for (Partido partidoConsultado : listaPartidos) {
				completarInformacionPartido(partidoConsultado);
			}
			
			
		}
		
		
		return listaPartidos;
	}
	
	/**
	 * Se crea partido sin sede, sin fecha de programacion 
	 * 
	 * @param session
	 * @param partido
	 * @param mensajeError
	 * @return
	 */
	
	public Partido crearPartidoTransaccional(SqlSession session, Partido partido, StringBuffer mensajeError){
		
		try {
			
			Boolean sinErrores = true;
			
			Long idPartido = PartidoControllerDB.getInstance().getSiguienteIDPartidoTransaccional(session);
			partido.setPartido(idPartido);
			
			sinErrores = PartidoControllerDB.getInstance().crearPartidoTransaccional(session, partido) && sinErrores;
			
			if(sinErrores){
				
				return partido;
			}else{
				
				mensajeError.append("Error creando el partido.");
				return null;
			}

		}catch (Exception e) {
			session.rollback();
			SimpleLogger.error("Error ", e);
			mensajeError.append("Error creando partido. No se ha podido finalizar correctamente.");
			
			return null;
			
			
		} 	
		
		
		
	}
	
	
	public Boolean programarPartidosTransaccional(List<Partido> partidos, StringBuffer mensajeError){
		SqlSession session = DBManager.openSession();
		
		try {
			
			Boolean sinErrores = true;
			
			
			for (Partido partido : partidos) {
				
				//Se cambia el estado del partido a PROGRAMADO
				partido.setEstado(Partido.ESTADO_PROGRAMADO);
				
				sinErrores = PartidoControllerDB.getInstance().programarPartidoTransaccional(session, partido)&& sinErrores;
				
			}
			
			//Si no existen errores se finaliza la transaccion
			if(sinErrores){
				
				session.commit();
			}else{
				mensajeError.append("No fue posible realizar la programacion. Por favor intentelo nuevamente");
				session.rollback();
			}
						
			
			
			return sinErrores;

		}catch (Exception e) {
			session.rollback();
			SimpleLogger.error("Error ", e);
			mensajeError.append("Error creando grupo. No se ha podido finalizar correctamente.");
			
			return null;
			
			
		} 	finally {
			session.close();
		}
		
		
		
	}
	
	
	private void completarInformacionPartido(Partido partido){
		
		//Calcular informacion del grupo
		Grupo grupo = GrupoServicio.getInstance().getGrupo(partido.getGrupo());
		partido.setGrupoAsociado(grupo);
		
		//Se consulta los equipos
		Equipo equipoUno = EquipoServicio.getInstance().getEquipo(partido.getEquipo_1());
		partido.setEquipoUno(equipoUno);
		
		Equipo equipoDos = EquipoServicio.getInstance().getEquipo(partido.getEquipo_2());
		partido.setEquipoDos(equipoDos);
		
	}
	

}
